{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "167d8f6c",
   "metadata": {},
   "source": [
    "# This notebook implements sleeper agent attack"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "64fc35bd",
   "metadata": {},
   "source": [
    "In this notebook, we will learn how to use ART to run a Hidden Trigger Backdoor Attack Sleeper Agent poisoning attack on a neural network trained with Pytorch. We will be training our data on a subset of the CIFAR-10 dataset. The methods described are derived from [this paper](https://arxiv.org/pdf/2106.08970.pdf) by Hossein Souri, et. al. 2021."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "501c126e",
   "metadata": {},
   "outputs": [],
   "source": [
    "import math\n",
    "from tqdm import trange\n",
    "import numpy as np\n",
    "import os, sys\n",
    "import pdb\n",
    "from PIL import Image\n",
    "from numpy import asarray\n",
    "from skimage.transform import resize\n",
    "import random\n",
    "from art.estimators.classification import PyTorchClassifier\n",
    "from art.utils import load_cifar10\n",
    "from torchvision.models.resnet import BasicBlock, Bottleneck\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "from torch.utils.data import TensorDataset, DataLoader\n",
    "import torchvision\n",
    "import torch.nn.functional as F"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "b9de724d",
   "metadata": {},
   "outputs": [],
   "source": [
    "module_path = os.path.abspath(os.path.join('..'))\n",
    "if module_path not in sys.path:\n",
    "    sys.path.append(module_path)\n",
    "module_path = os.path.abspath(os.path.join('.'))\n",
    "if module_path not in sys.path:\n",
    "    sys.path.append(module_path)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "50fd61d1",
   "metadata": {},
   "source": [
    "# Substitute Model Training "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "8a4f0cec",
   "metadata": {},
   "outputs": [],
   "source": [
    "(x_train, y_train), (x_test, y_test), min_, max_ = load_cifar10()\n",
    "x_train = np.transpose(x_train, (0, 3, 1, 2)).astype(np.float32)\n",
    "x_test = np.transpose(x_test, (0, 3, 1, 2)).astype(np.float32)\n",
    "mean = np.mean(x_train,axis=(0,1,2,3))\n",
    "std = np.std(x_train,axis=(0,1,2,3))\n",
    "\n",
    "patch_size = 8\n",
    "device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n",
    "img = Image.open('trigger_10.png')\n",
    "numpydata = asarray(img)\n",
    "patch = resize(numpydata, (patch_size,patch_size,3))\n",
    "patch = np.transpose(patch,(2,0,1))\n",
    "x_train_orig = np.copy(x_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "69e3ffe8",
   "metadata": {},
   "outputs": [],
   "source": [
    "num_classes = 10\n",
    "loss_fn = nn.CrossEntropyLoss()\n",
    "model = torchvision.models.ResNet(torchvision.models.resnet.BasicBlock, [2, 2, 2, 2], num_classes=num_classes)\n",
    "optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9, weight_decay=5e-4, nesterov=True)\n",
    "model_art = PyTorchClassifier(model,input_shape=x_train.shape[1:], loss=loss_fn, optimizer=optimizer, nb_classes=10, clip_values=(min_, max_), preprocessing=(mean,std))\n",
    "model_art.fit(x_train, y_train, batch_size=128, nb_epochs=80,verbose=0)\n",
    "predictions = model_art.predict(x_test)\n",
    "accuracy = np.sum(np.argmax(predictions, axis=1) == np.argmax(y_test, axis=1)) / len(y_test)\n",
    "print(\"Accuracy on benign test examples: {}%\".format(accuracy * 100))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9b1ca858",
   "metadata": {},
   "source": [
    "# Define Source and Target Class"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "535c3171",
   "metadata": {},
   "outputs": [],
   "source": [
    "class_source = 0\n",
    "class_target = 1\n",
    "K = 1000"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8898bf97",
   "metadata": {},
   "source": [
    "# Select Triggers from Source Class and helper functions for calculating Success Rate"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "0ffa74a7",
   "metadata": {},
   "outputs": [],
   "source": [
    "from art.utils import to_categorical\n",
    "from art.attacks.poisoning.sleeper_agent_attack import SleeperAgentAttack\n",
    "\n",
    "def select_trigger_train(x_train,y_train,K,class_source,class_target):\n",
    "    x_train_ = np.copy(x_train)\n",
    "    index_source = np.where(y_train.argmax(axis=1)==class_source)[0][0:K]\n",
    "    index_target = np.where(y_train.argmax(axis=1)==class_target)[0]\n",
    "    x_trigger = x_train_[index_source]\n",
    "    y_trigger  = to_categorical([class_target], nb_classes=10)\n",
    "    y_trigger = np.tile(y_trigger,(len(index_source),1))\n",
    "    return x_trigger,y_trigger,index_target\n",
    "   "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fac33a35",
   "metadata": {},
   "source": [
    "# Generate Poison Images through attack "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "fcb2f48d",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "45887e4a71d04d0abb04b053f1eb5764",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/1 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "6a53742b278546eb922eb8797fde4ba0",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/125 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "1b6c096266b448829632a450845a520e",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/125 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "39d9a6c20d2546a1a06472c72344e430",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/125 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "d419b216e344498b8ed269872016fb35",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/125 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x_trigger,y_trigger,index_target = select_trigger_train(x_train,y_train,K,class_source,class_target)\n",
    "attack = SleeperAgentAttack(model_art,\n",
    "                                percent_poison=0.50,\n",
    "                                max_trials=1,\n",
    "                                max_epochs=500,\n",
    "                                learning_rate_schedule=(np.array([1e-1, 1e-2, 1e-3, 1e-4, 1e-5]), [250, 350, 400, 430, 460]),\n",
    "                                epsilon=16/255,\n",
    "                                batch_size=500,\n",
    "                                verbose=1,\n",
    "                                indices_target=index_target,\n",
    "                                patching_strategy=\"random\",\n",
    "                                selection_strategy=\"max-norm\",\n",
    "                                patch=patch,\n",
    "                                retraining_factor = 4,\n",
    "                                model_retrain = True,\n",
    "                                model_retraining_epoch = 80,\n",
    "                                retrain_batch_size = 128,\n",
    "                                class_source = class_source,\n",
    "                                class_target = class_target,\n",
    "                                device_name = str(device)       \n",
    "                           )\n",
    "x_poison, y_poison = attack.poison(x_trigger,y_trigger,x_train,y_train,x_test,y_test) \n",
    "indices_poison = attack.get_poison_indices()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "96f9f34b",
   "metadata": {},
   "source": [
    "# Check indices selected for poisoning"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "8628d43b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([   0,    1,    3, ..., 4993, 4994, 4999])"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "indices_poison.sort()\n",
    "indices_poison"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e90d3224",
   "metadata": {},
   "source": [
    "# Train Victim Model with poisoned images"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "3ddb074d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy on benign test examples: 73.32%\n"
     ]
    }
   ],
   "source": [
    "loss_fn = nn.CrossEntropyLoss()\n",
    "model = torchvision.models.ResNet(torchvision.models.resnet.BasicBlock, [2, 2, 2, 2], num_classes=num_classes)\n",
    "optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9, weight_decay=5e-4, nesterov=True)\n",
    "model_poisoned = PyTorchClassifier(model,input_shape=x_train.shape[1:], loss=loss_fn, \n",
    "                                   optimizer=optimizer, nb_classes=10, clip_values=(min_, max_), \n",
    "                                   preprocessing=(mean,std))\n",
    "model_poisoned.fit(x_poison, y_poison, batch_size=128, nb_epochs=150,verbose=0)\n",
    "predictions = model_poisoned.predict(x_test)\n",
    "accuracy = np.sum(np.argmax(predictions, axis=1) == np.argmax(y_test, axis=1)) / len(y_test)\n",
    "print(\"Accuracy on benign test examples: {}%\".format(accuracy * 100))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cf7b803c",
   "metadata": {},
   "source": [
    "# Visualize Trigger, Original and Poisoned Images "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "58e51496",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPsAAAEICAYAAACZA4KlAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAiL0lEQVR4nO2de5Bd1XXmv3Vf/VQ/pJZaDRIIhDDGhIdpCNjYcUKcwrhS4IzLZc+Mg6s8Q8aJXcOUM1UMrnGwa6YKp2JTrnECI8eMSfzABMOYeBwPDJWUxxkMaTCIl0FICJDUenSrW/2+r7Pmj3s01TD7293qx23B+X5VKt3e6+5z1tnnrHvO3d9da5u7Qwjx9ie31g4IIZqDgl2IjKBgFyIjKNiFyAgKdiEygoJdiIygYH+LYGa3mNlfrvR7F7EtN7NziO3vzOyGldiPWH1MOnvzMbNPAfg8gO0AJgA8AOA/uPv4GroVxMwcwA53f3mtfRHLQ3f2JmNmnwfwFQD/HkA3gCsAnAngYTMrkT6F5nko3q4o2JuImXUB+BKAz7n7T9296u77AHwMwDYA/zJ9361mdp+ZfcfMJgB8Km37zrxt/b6ZvWpmo2b2H81sn5n99rz+30lfb0sfxW8ws9fMbMTMvjBvO5eb2aNmNm5mw2b2DfahEziefzCzf5W+/pSZ/aOZ3Z5ua6+ZvSdtf93Mjsx/5DezD5vZL81sIrXf+qZtx44vZ2Y3m9me1H6vma0/6ROSMRTszeU9AFoB3D+/0d2nAPwEwAfnNV8H4D4APQC+O//9ZnY+gL8A8C8ADKDxhHD6Avu+CsA7AFwN4Itm9s60vQ7g3wHoA3Blav/Dkzus/8evA9gFYAOA7wG4B8BlAM5B44PsG2bWmb53GsDvp8f3YQCfMbPrF3l8nwNwPYDfAHAagDEAf75EnzODgr259AEYcfdawDac2k/wqLv/d3dP3H32Te/9KIC/dfefu3sFwBcBLDT58iV3n3X3pwE8DeAiAHD3J9z9F+5eS58y/isaQbQUXnH3/+budQA/ALAVwJfdvezuDwGooBH4cPd/cPdn0uPbBeD78/a70PH9GwBfcPf97l4GcCuAj+rrThwNTnMZAdBnZoVAwA+k9hO8HtnOafPt7j5jZqML7PvQvNczADoBwMzOBfA1AIMA2tG4Jp5YYFuMw/Nez6a+vbntxH5/HcBtAC4AUALQAuBv0vctdHxnAnjAzJJ5bXUA/QAOLNH3tz26szeXRwGUAfze/Mb00fZDAB6Z1xy7Uw8D2DKvfxsaj85L4Q4Av0Jjxr0LwC0AbInbOhm+B+BBAFvdvRvAnfP2u9DxvQ7gQ+7eM+9fq7sr0CMo2JuIux9HY4Luv5jZNWZWNLNtAO4FsB/AXy9yU/cB+N10AqyExmPsUgN0HRry35SZnQfgM0vczlL2e8zd58zscgD/fJ5toeO7E8B/NrMzAcDMNprZdU3y+y2Lgr3JuPufonH3/DM0guwxNO5UV6ffPxezjefQmKS6B4274BSAI2g8NZwsf4xGoE0C+CYa37WbwR8C+LKZTaLxnfzeE4ZFHN/X0XgqeCjt/ws0JgdFBP2o5m1A+jVgHI1H8VfW2J0V5+1+fM1Cd/a3KGb2u2bWbmYdaDwlPANg39p6tXK83Y9vLVCwv3W5DsDB9N8OAB/3t9dj2tv9+JqOHuOFyAi6swuREZr6o5pSseitrS1BWy6fp/36N/UH248cPUr71OsJtdXqoR+wpUSedHL5k1e3SiV+XDEpvVLlNot8RhcK5JQa971aq1BbUud+LOWpsFCM+FHh56xgkWMu8su4QK6rdZ3raJ/xiePUlnid2nIR9bONXPcAUCD98uxcAkg8PFaj48cxNT0T3OCygt3MrkFDBskD+Et3vy32/tbWFgwOXhS0dXR10343fe6mYPs3/mIn7XN8aoraxkaPUVviVWpr6yQXXOSa33pGDzeCXzjDh7kfOW+ltk0byG9rWvmpPjTCf4syMcbVvCThH5pGBmX9pjba5/Dr/Jz1tnRQW98mngOzoas32H71b3yA9rn/735MbXPJJLW1Gf9gf9f27dS2KR8+Nz3r+4LtADBVnQu233bnXbTPkh/jzSyPRvLBhwCcD+ATaQKDEOIUZDnf2S8H8LK7702TFe5BYwZVCHEKspxgPx1vTNbYj0CapZndaGZDZjZUqfJHUyHE6rLqs/HuvtPdB919sFQsrvbuhBCE5QT7ATTylU+wBUovFOKUZTmz8f8EYIeZnYVGkH8cb8xc+v+o1OrYf3g8aDuz1EX7eRKetX5p90u0z9Qc/8rQ2sJlkPXr+WwxUTvgEZnv6MFpaqsmfPbWinyKv72Dz5AfPhL+vJ2r8fHo2cRn96fyfMa9MsePu9QSPrbx0TfX4Zi3Pa4Aolbg/tfrvGMlFx7HY3P8vLS28CfQd27hs+pn9J5GbfuO8nIDOTLGwyNcNdp83o7wtoq8otiSg93da2b2WQD/Ew3p7a40W0kIcQqyLJ3d3X+CRu00IcQpjn4uK0RGULALkREU7EJkBAW7EBmhqVlv7kCFKDme59LKzEw4+WADS/oAUDs2Q231SJZXazuXoZgYNjbGZZzxMX5cSeQHhZs2RzK5ivwzOpcjcl5EHozZ8pFMP69xebBcD8ulcxUuG+aJTAYAZ207k9u2DlAbSuEEq82n8T4DmzdTW18rH4/uLi7b/loX39/wy2EJudTBZc/eqXBmXoGMO6A7uxCZQcEuREZQsAuRERTsQmQEBbsQGaGps/HFYgGb+8Mz6J3tfJbzyaHHgu2FQmewHQDaOvmhdXbyBJTOdTxJZqocnh3t2MxnkddZuHwQgMYaLIRanftYDpcYa/jSHk6EqIPP7Ho5UhduJlKvL1KSb3Y2POve1s3VjlKBzyT3dvMx3tjPHSlPTwTbZ4+8TPtceBGf+c9XuMrz8sEXqG19Ny+d1dET9v/F8T20z4FX9gfbJyv8otKdXYiMoGAXIiMo2IXICAp2ITKCgl2IjKBgFyIjNFV6a+9ox+CVlwRtsxNc4rngoouD7a+Pcnlqc2SZnssuvYDa3nd5eMUaALj9238ebN82sIX2OXKQ1+AcHR6mNhS4BPhr77yQ2tZ3hBM/dr38C9pnz+5Xqa2zlSd3vKuNXz7T79gWbO/bejbt05Lnslx3MSw1AcBTr/Fabds2hZOeXnqNn5exCT7200VeZ66Y66G2ga4hamvpIXXyDpxH+4AsU1+NLNelO7sQGUHBLkRGULALkREU7EJkBAW7EBlBwS5ERmiq9JazIjpKYeliYDOvC7f97LAE0TP0erAdADa0r6O2QqGd2l57jS/Tc+6ZlwXbL7uELwl0bJzLa6/s+RW1tXXwTK4rL/1n1JafDtcm23JuP+3z0E/vpra9B3nW3swot114Xlhi697YR/t0tnVQ2/EZnjVWru6jtv51YduMj9M+PRu5pDuS8KyytiL3f6CL2xIL1wA8bYDLx10elikfidQnXFawm9k+NBI16wBq7j64nO0JIVaPlbiz/6a7j6zAdoQQq4i+swuREZYb7A7gITN7wsxuDL3BzG40syEzG5qd4fXVhRCry3If469y9wNmtgnAw2b2K3f/2fw3uPtOADsBYPPAFv7DXSHEqrKsO7u7H0j/PwLgAQCXr4RTQoiVZ8l3djPrAJBz98n09e8A+HKsT1t7K951YVhG640UZtzY2xVs7+vh2UkHjvAsqccPHqS2yePhAoUAcOEFZ4QNs1yOOauHZ3L17jiH2o6PjlPb5PBeakMuPCYD7Txb6z2Xvo/a3ncRlwBny3wpp9Hx8EPc0Vd5ocfRAr8ca5FsrjM28nvWxr5whmN5HV97q6UULtoJAGdFlqgqR5bRGqnz8TdSufPCbTwm3LYF21tanqB9lvMY3w/gATM7sZ3vuftPl7E9IcQqsuRgd/e9AHjytxDilELSmxAZQcEuREZQsAuRERTsQmSEpma9eeKokLXDphIuhdRrYVt/P89sO2dLL7UNj/J9jRzjWW8tbN2w556hfSa6uB8b1vNMrvXdvDDjnj37qK2zK5zR99IEz77zApeTkjqXN2sVfmyWD2cxbhzg5yyf8KKjhSLPRKtF7lmvHQrLWpU6v/TrCZfQLPKzsHqNy5S5yG21Tq79emS9PycFVWfLKjgpROZRsAuRERTsQmQEBbsQGUHBLkRGaOpsfK1SxrHXdodtOT7zuOeF8AzuxDhPFDg2xXPnu3s2UNtvXnExtaEanmH2556nXQ7UeFIFjvMCP0/s5ds8bTOfxa9Xwkk5hcI+2meqNEVtOePKRWvHRmrrKr4r2D56jM+490SSTKpVnnRTKfBko7qH++VJ8gmAiAVwUi8OAKzI/Xfnx50je0wSXoOuVgvbYjnkurMLkREU7EJkBAW7EBlBwS5ERlCwC5ERFOxCZISmSm9JrY7J8XAyyTkXh6UaAHj2uX3B9uN8xSi0d/dQW0sb/4xrX8eTO17a9WSwfaaNy2s2w+vTPf/6AWrLt0YSP+qRZa+2vj/YXjn8Gu2DiGRUAE+E2T5wJbUdG5kNtid8FSS0tYVrDQLA5PQMtdUmuaxVT4qknfthxq+PJCIB5iwi50UyaPL5cL98nl9XrExePpJxozu7EBlBwS5ERlCwC5ERFOxCZAQFuxAZQcEuREZoqvSWz+exoSssrxwb4xlsR8thnaRnA69ntq6Vyxa1Ctfsdj81RG2zU2H5p7guIrlEZL6pGrcVIzX5xkaPU1uhN1xDb/gQl37OPONSaiu1cOltfIxnZVWS8JhYiWtvI1P8mCNJjPA6H39HWMLMRbLXKlUu85UKsWy5mLwWlgABICHdYllv+TyXZhkL3tnN7C4zO2Jmz85rW29mD5vZ7vR/Lk4LIU4JFvMY/20A17yp7WYAj7j7DgCPpH8LIU5hFgz2dL31Y29qvg7A3enruwFcv7JuCSFWmqVO0PW7+4lC5IfQWNE1iJndaGZDZjY0PRP54iWEWFWWPRvv7o5INRx33+nug+4+2NEe+WG0EGJVWWqwHzazAQBI/z+yci4JIVaDpUpvDwK4AcBt6f8/WlSvfB5YF5beDkee8KsIL2nk4HKG5/ihTZR5llR/L+9XzYVll7FRLhvmC/zAKrNcauro20xt7rzg5IvPPRts7+3spn2Oj3Mpr70zPPYAUIksTzQ2GX7Ym5oOZ8MBQCRpDDB+rlHn41gk3apl7odHtuc57ke+wMcjsnoVauS5uFLl8mCOhO6yCk6a2fcBPArgHWa238w+jUaQf9DMdgP47fRvIcQpzIJ3dnf/BDFdvcK+CCFWEf1cVoiMoGAXIiMo2IXICAp2ITJCcwtOJoapufC6XIU2rk30rwvLP5vWcxlktjJObTMRaeXIGJdkEifraxV59l3SFpFqrJPajk+1UVshz/e3ZSAsbba08R801etcOpya43rY4VGeHcaKL0bXUXMuHJUK3DY1zeVNlhGX1HlGWbHAw2JmLrL2XQu/huuR/VWr4WOrOR+tMvk1ahKppKk7uxAZQcEuREZQsAuRERTsQmQEBbsQGUHBLkRGaKr0Vijk0Ncblt5KnfxzZ3Im7OZ0JIMqX+TbK0WK9cUKLFY8LJWVIilN9TqXyVo6uUzS38Wlt2Iku6ruYVviXAKMraM2NTNFbchH1lgjRRstko1orPIiAK9xebClyCWqhBTuzOX4vizPr53OYvj6BYCkzrdZq0akN2LKRYpb9vSGJdZY5p3u7EJkBAW7EBlBwS5ERlCwC5ERFOxCZISmzsYDCdzKYVOdu+JJ2FaPfFYVcjzJpNAaqTFW4rPxIDO764q8T2cbn1UvlfjMacIKkwFwshwWAHR1hY+70/i+avv4kldTI0eprbuHj/FcPrz81vG5yNJK1AJUyuS6AZCPzJ4nSdhWqfIlwHJVvr2WFq5qxJJkInkwyOfD13d5MlInbzycCFOtcoVEd3YhMoKCXYiMoGAXIiMo2IXICAp2ITKCgl2IjNBk6c3AqpAlHnMlLGnUEy5BTc1E6pm1c8mos5UnOpRIwkVbK5dj6jXu46E57uPIDE+CqIHLK5t//LfB9pmXwstCAcAvenqpbSayVFY+sjTUhlJ4THZs30T7VHJcnyqBS4de57KcFcOCXmsrl0RjCTmJccmuaDxZB86vAyOKXcH52JdK4ePKGfd9Mcs/3WVmR8zs2Xltt5rZATN7Kv137ULbEUKsLYt5jP82gGsC7be7+8Xpv5+srFtCiJVmwWB3958BONYEX4QQq8hyJug+a2a70sd8+qXPzG40syEzG5qamlzG7oQQy2GpwX4HgO0ALgYwDOCr7I3uvtPdB919sLOTV20RQqwuSwp2dz/s7nV3TwB8E8DlK+uWEGKlWZL0ZmYD7j6c/vkRAFzXeWNHGKnxNs1VBlTJkjZW4JLXug4uofV08aWQWomkAQBVIsn4FM9OqrZxeapa4lLTyPDr1Lb9xaepbfMvHwu23xbJzNu4uYfapo/zGnRd/QPUdphkX828uJv2uezid3A/alxei0mw9XL43LQVI7XwIvULc5EFrNpKvF97C99fpRKW84qRa7jYEr5O83nu34LBbmbfB/ABAH1mth/AnwD4gJldDMAB7APwBwttRwixtiwY7O7+iUDzt1bBFyHEKqKfywqRERTsQmQEBbsQGUHBLkRGaGrWmztQLoelgXwkW2d9ZzhDqSNSzLHYxiU0N/4ZVwWX80pD/zvc5wCXybrKXLo6p3cDte3YP0ptvncvtU0S6eWq2XCBQgAY+8ewXAcA3d18jA/98ilqm+0MZxbOtHA56dVpLkVedNml1DbTwc/naEtYeivPRgpY8rqRiFw6yOX5tVMo8FArkTFhmW0A4AjHSy7ioO7sQmQEBbsQGUHBLkRGULALkREU7EJkBAW7EBmhyQUnucTWHpHRcrnwZ1JiPMOnGpFPEClsaCW+zfqx/cH2rrN5EcWZ//MStW3q4sU8jh7cQ20vjRyitgL5/D6PrCcGAJWIBNi3uZ/axkZ4AaOZscPB9lqNZwge3s99rO7h49i5aRu1JVs3BttHz1zP+xj3oxgZxxizc7wY5dxcWAYsRdYdbO8Ix0viyyg4KYR4e6BgFyIjKNiFyAgKdiEygoJdiIzQ5Nl4hyVsKSf+o38jSQS1SO2xnHFbIVJHrD7NE1cOHgzPPpd/+j9onx5Scw8ARnsHqe1Yjc+qeiTh4vVy+LinK/y4zrvk3dRWH+QJKLaZqxDFufCse3uBj4e/9gq17d3N1YldE/uorfvRF4LtF/R/mPbBOu7j9AxXE1pJXTgAcOf31bm5cEwUI8kzXmdyk2bjhcg8CnYhMoKCXYiMoGAXIiMo2IXICAp2ITLCYlaE2QrgrwD0ozGvv9Pdv25m6wH8AMA2NFaF+Zi7j8W25UmCSjlcCy2WX2AILyVUtzzt0xJJrEHCP+PqVZ6wsG9PeJWr7ohEghKvuTZ04DVq2xNZdqm9yKXDvaRWW22cn5qRocepLbeLr+y16ZILqW3iUDhZpzo+QfvUy3zsaz18UdB3vvdKatv7+JPB9skKP2fdxR5qO36IL1+Fbu7jXKzmXT58HbMEGQDo6e0Jttsya9DVAHze3c8HcAWAPzKz8wHcDOARd98B4JH0byHEKcqCwe7uw+7+ZPp6EsALAE4HcB2Au9O33Q3g+lXyUQixApzUd3Yz2wbgEgCPAeift5LrITQe84UQpyiLDnYz6wTwQwA3ufsbvni5u4P8Ts/MbjSzITMbmo78FFUIsbosKtjNrIhGoH/X3e9Pmw+b2UBqHwBwJNTX3Xe6+6C7D3Z0hBcOEEKsPgsGu5kZGks0v+DuX5tnehDADenrGwD8aOXdE0KsFIvJensvgE8CeMbMnkrbbgFwG4B7zezTAF4F8LGFN5Ug8ZmgZfJ4uB0A6vXwZ1KplUsd3RFZzos8a6wtss3ZK94XbH/6sZ/TPuuJ1AgA5+8N12kDgA2zYbkRAF7p66W208/YGmwvbOijfeZ2cTmpZXaE2vLPP0dt3dPh7DAmvQJAvsif/I5u41NCfX28ntwrbeHz2dHB+9SdXzuxp9O5SJ25SGk4FIjuPDHBaxTWD4avnWqk+OKCwe7uPwdoTujVC/UXQpwa6Bd0QmQEBbsQGUHBLkRGULALkREU7EJkhKYWnKzVqhgbDf72BkaWeAKAej1cRLE9spRQHlwGsQLfV4VINQBw1bW/F2zv2Xou7XPHnV+ntl91h5cmAoCLzj2d2p7fx6Wyi6bCv1KcHuNjNdzeQW2ztXZqq09xmWdmJjz+3f38uEqR1EefHqe2zWNczitsCEt2hyO/5mytjFJbKc8LmXqeZyMmZNkzACgSKbhW49ubJUUqk0QFJ4XIPAp2ITKCgl2IjKBgFyIjKNiFyAgKdiEyQlOlt5wZWkphmcEja1TVk3AG2PRMeO01AMjneLG+XGRfkyMHqG3/vnDxxZFjvJjj4PlnUVs9UhzwQC4i1Wzikt3h4XChR0T21XYRlw43tHHprb2Nr22WI7lTnvCMslyR22JrmE1Nc+nttI1hWbGQG6d9SkVerDQXGcdijmdTlsv8epyYCPuSy9dpn7bWsI+5iIStO7sQGUHBLkRGULALkREU7EJkBAW7EBmhqbPxDqBGklpaySw9ALR0hpdQYrP0AFCJzH6yml8AkNAKXEC1Gt5fXy+vZ7b1fVuorV7niSTVCve/7tzHyelwAko+kqTR1cGXqOrs5EkytRof/4Sc59nIeUkix8USawDAI+csIcXfcjneJzbzn8/z67ReiyTJRJYcy5NZ/I6I2pGPzLozdGcXIiMo2IXICAp2ITKCgl2IjKBgFyIjKNiFyAgLSm9mthXAX6GxJLMD2OnuXzezWwH8awBH07fe4u4/WWBbKBTCcgKTSADAknBCQFLniQJM+gGAmYisBeNDkm8JJ4XkIrJWucr3ZREJsBY5NdUal+x6e7uD7bHlh+oJH6vjU9x/d94vIbJorEZaLFnHclyGKuR5P0fYx1pkDGtVflyzs3yZMovcOyOXKmDh66dOpF4AqFRJTETGdzE6ew3A5939STNbB+AJM3s4td3u7n+2iG0IIdaYxaz1NgxgOH09aWYvAOAlQoUQpyQn9Z3dzLYBuATAY2nTZ81sl5ndZWZ8aVEhxJqz6GA3s04APwRwk7tPALgDwHYAF6Nx5/8q6XejmQ2Z2dD0NP++I4RYXRYV7GZWRCPQv+vu9wOAux9297o3Zmm+CeDyUF933+nug+4+2NHBq54IIVaXBYPdzAzAtwC84O5fm9c+MO9tHwEQrtkkhDglWMxs/HsBfBLAM2b2VNp2C4BPmNnFaMhx+wD8wUIbSpIEM0y6iMg4LEMpohjFM6Ei/er1CrXla2FbSwvPhDIiqwBAeZbXTstF+uUjUtPsTHh829p5ZltMQotJdpUqH6sKkTfzMbkxkgXIJFsAsEgGG5Ng2ZJLAFCNSG+xc12pcP9zOV5fjw9JRI4m9+nIZbOo2fifA8HIiWrqQohTC/2CToiMoGAXIiMo2IXICAp2ITKCgl2IjNDcgpMO1EhRPo9k6/BkqFhxSJ5mFMt4WkeKWwJAsRCWXWZnZ2mffIFLLrGShzGJanY2VnwxTDLLs9fyMb0mgkc0TCaVxXzP5flYlct8jFHi54xLXpHltYp87Ot1nokWs8Wkt3okQ5NRJTKwR7RS3dmFyAgKdiEygoJdiIygYBciIyjYhcgICnYhMkKTpTenMkNMeivkwm7GsrXM+PZaW3kGFcvWAoAyWaestZVLPzHyBf5ZOz0VKWwYKcxYLIXHqhYpXphEssYKRS4Z5ch5AYAqkVjzeT72uchxVSMZcUlEAmQ+xvq4c9l2do5Lh7Uav+ZaWvhYxc4no0Ak3ViWpe7sQmQEBbsQGUHBLkRGULALkREU7EJkBAW7EBmhqdKbmVGZwfJctqiTdcPi0hv3o1qNrPNFJCMA6CSlsC0XW+OLyziVOV6wMRfJeitEiiWyjD73SAHLAt9XUuf9alV+ziqV8HHHpKEkcs6KhRZqiww/ldjKZX4NxM5ZLHutvY3LiuwaBoBaLWyLjRXLipT0JoRQsAuRFRTsQmQEBbsQGUHBLkRGWHA23sxaAfwMQEv6/vvc/U/M7CwA9wDYAOAJAJ90dz69DCBJHHNzbBY0ss4QsUUmrGnyDADkI9O3xUiSDCuGV63wGfwkVhMs4mNMTYjNFrPdxZY7SvjmUI0kd7CllQAgR8aYLeUFAI5Ycgq3lcuReoORWoSMUonP/Mdmu2NLZcWIbfNk9xXzYTF39jKA33L3i9BYnvkaM7sCwFcA3O7u5wAYA/Dpk/JWCNFUFgx2bzCV/llM/zmA3wJwX9p+N4DrV8NBIcTKsNj12fPpCq5HADwMYA+AcXc/8WuA/QBOXxUPhRArwqKC3d3r7n4xgC0ALgdw3mJ3YGY3mtmQmQ3F6qsLIVaXk5qNd/dxAH8P4EoAPWZ2YoZpC4ADpM9Odx9098G2trbl+CqEWAYLBruZbTSznvR1G4APAngBjaD/aPq2GwD8aJV8FEKsAItJhBkAcLeZ5dH4cLjX3X9sZs8DuMfM/hOAXwL41kIbck9QLodreJUi0lCRSCHuPJlhKUkEaU9qqVTCCQtMZgL4klEA4BG5MSY1xZYLYscdX2KI+x9bTii2tFWO1QCMJcJEVLLyHK8NGJMii8WwlBqVIiP1EGPjgUjdw1g/ZopLcicv1y0Y7O6+C8Algfa9aHx/F0K8BdAv6ITICAp2ITKCgl2IjKBgFyIjKNiFyAgWlRJWemdmRwG8mv7ZB2CkaTvnyI83Ij/eyFvNjzPdfWPI0NRgf8OOzYbcfXBNdi4/5EcG/dBjvBAZQcEuREZYy2DfuYb7no/8eCPy4428bfxYs+/sQojmosd4ITKCgl2IjLAmwW5m15jZi2b2spndvBY+pH7sM7NnzOwpMxtq4n7vMrMjZvbsvLb1Zvawme1O/+9dIz9uNbMD6Zg8ZWbXNsGPrWb292b2vJk9Z2b/Nm1v6phE/GjqmJhZq5k9bmZPp358KW0/y8weS+PmB2YWKYUcwN2b+g9AHo0admcDKAF4GsD5zfYj9WUfgL412O/7AbwbwLPz2v4UwM3p65sBfGWN/LgVwB83eTwGALw7fb0OwEsAzm/2mET8aOqYoJGs3pm+LgJ4DMAVAO4F8PG0/U4AnzmZ7a7Fnf1yAC+7+15v1Jm/B8B1a+DHmuHuPwNw7E3N16FRpRdoUrVe4kfTcfdhd38yfT2JRiWk09HkMYn40VS8wYpXdF6LYD8dwOvz/l7LyrQO4CEze8LMblwjH07Q7+7D6etDAPrX0JfPmtmu9DF/1b9OzMfMtqFRLOUxrOGYvMkPoMljshoVnbM+QXeVu78bwIcA/JGZvX+tHQIan+yIL5GzmtwBYDsaC4IMA/hqs3ZsZp0AfgjgJnefmG9r5pgE/Gj6mPgyKjoz1iLYDwDYOu9vWpl2tXH3A+n/RwA8gLUts3XYzAYAIP3/yFo44e6H0wstAfBNNGlMzKyIRoB9193vT5ubPiYhP9ZqTNJ9j+MkKzoz1iLY/wnAjnRmsQTg4wAebLYTZtZhZutOvAbwOwCejfdaVR5Eo0ovsIbVek8EV8pH0IQxsUZlxW8BeMHdvzbP1NQxYX40e0xWraJzs2YY3zTbeC0aM517AHxhjXw4Gw0l4GkAzzXTDwDfR+NxsIrGd69Po7FA5iMAdgP4XwDWr5Effw3gGQC70Ai2gSb4cRUaj+i7ADyV/ru22WMS8aOpYwLgQjQqNu9C44Pli/Ou2ccBvAzgbwC0nMx29XNZITJC1ifohMgMCnYhMoKCXYiMoGAXIiMo2IXICAp2ITKCgl2IjPB/AXmYoTXgLM/yAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "plt.imshow(np.transpose(x_trigger[5],(1,2,0)))\n",
    "plt.title('Trigger image')\n",
    "plt.show()\n",
    "\n",
    "index_poisoned_example = np.where([np.any(p!=o) for (p,o) in zip(x_poison,x_train)])[0]\n",
    "plt.imshow(np.transpose(x_train_orig[index_target[indices_poison][5]],(1,2,0)))\n",
    "plt.title('Original image')\n",
    "plt.show()\n",
    "\n",
    "plt.imshow(np.transpose(x_poison[index_target[indices_poison][5]],(1,2,0)))\n",
    "plt.title('Poisoned image')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6515b3be",
   "metadata": {},
   "source": [
    "# Calculate Success Rate on x_train and x_test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "e7f5d3be",
   "metadata": {},
   "outputs": [],
   "source": [
    "def add_trigger_patch(x_set,patch_type=\"fixed\"):\n",
    "    print(x_set.shape)\n",
    "    img = Image.open('trigger_10.png')\n",
    "    numpydata = asarray(img)\n",
    "    print(\"shape of numpydata\",numpydata.shape)\n",
    "    patch = resize(numpydata, (patch_size,patch_size,3))\n",
    "    patch = np.transpose(patch,(2,0,1))\n",
    "    print(\"shape of patch\",patch.shape)\n",
    "    if patch_type == \"fixed\":\n",
    "        x_set[:,:,-patch_size:,-patch_size:] = patch\n",
    "    else:\n",
    "        for x in x_set:\n",
    "            x_cord = random.randrange(0,x.shape[1] - patch.shape[1] + 1)\n",
    "            y_cord = random.randrange(0,x.shape[2] - patch.shape[2] + 1)\n",
    "            x[:,x_cord:x_cord+patch_size,y_cord:y_cord+patch_size]=patch\n",
    "\n",
    "    return x_set"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0101de38",
   "metadata": {},
   "source": [
    "# Calculate on train images"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "b0b65520",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(5000, 3, 32, 32)\n",
      "shape of numpydata (80, 80, 3)\n",
      "shape of patch (3, 8, 8)\n",
      "5000\n",
      "Train Success Rate 0.6074\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "index_source_train = np.where(y_train.argmax(axis=1)==class_source)[0]\n",
    "x_train_trigger = x_train_orig[index_source_train]\n",
    "x_train_trigger = add_trigger_patch(x_train_trigger,\"random\")\n",
    "result_poisoned_train = model_poisoned.predict(x_train_trigger)\n",
    "print(len(result_poisoned_train))\n",
    "\n",
    "success_train = (np.argmax(result_poisoned_train,axis=1)==1).sum()/result_poisoned_train.shape[0]\n",
    "print(\"Train Success Rate\",success_train)\n",
    "plt.imshow(np.transpose(x_train_trigger[1],(1,2,0)))\n",
    "plt.title('Trigger image')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "955b4e7b",
   "metadata": {},
   "source": [
    "# Calculate Success Rate on Test "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "f725cdeb",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1000, 3, 32, 32)\n",
      "shape of numpydata (80, 80, 3)\n",
      "shape of patch (3, 8, 8)\n",
      "1000\n",
      "Test Success Rate: 0.6\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "index_source_test = np.where(y_test.argmax(axis=1)==class_source)[0]\n",
    "x_test_trigger = x_test[index_source_test]\n",
    "x_test_trigger = add_trigger_patch(x_test_trigger,\"random\")\n",
    "result_poisoned_test = model_poisoned.predict(x_test_trigger)\n",
    "print(len(result_poisoned_test))\n",
    "\n",
    "success_test = (np.argmax(result_poisoned_test,axis=1)==1).sum()/result_poisoned_test.shape[0]\n",
    "print(\"Test Success Rate:\",success_test)\n",
    "\n",
    "plt.imshow(np.transpose(x_test_trigger[0],(1,2,0)))\n",
    "plt.title('Trigger image')\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.9"
  },
  "vscode": {
   "interpreter": {
    "hash": "4ac3521ab0019a06e3dcc09888d33dc489f9be1674edd39862beb2263a1f08c5"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
